require "import"
import "android.widget.*"
import "com.androlua.*"

local sj = {
"Hướng dẫn viết nhấp chuột tự động bằng các AtI độc quyền của jsr.", 
"Tài liệu này mình dịch từ bản tiếng trung, nên chắc có lẽ sẽ có 1 vài sai sót, các bạn thông cảm tham khảonhé.", 
"mình rất mong các bạn có thể học hỏi được ít nhiều để viết được những hàm nhấp chuột tự động cơ bản.", 
"        Các cử chỉ và plug-in đa chức năng được giải thích bằng cú pháp lua với API độc quyền để triển khai nhiều chức năng của một cử chỉ.", 
"        Nếu bạn đã quen thuộc với lua và androlua, bạn có thể triển khai nhiều chức năng hơn. Tài liệu này chỉ mô tả phần API độc quyền.", 
"        các khái niệm cơ bản,", 
"        Service, dịch vụ chức năng phụ trợ, là cốt lõi của dịch vụ đọc màn hình này và mỗi chức năng đều dựa trên dịch vụ này.", 
"        Mô tả loại tham số,", 
"        Node, tiêu điểm hiện tại, nghĩa là nút hiện đang nhận tiêu điểm của chức năng phụ trợ, hoạt động chung được hướng đến tiêu điểm này.", 
"        bool, boolean, đúng hay sai.", 
"        Text, nội dung văn bản.", 
"        return, quay lại, thông báo cho trình đọc màn hình xem bạn có muốn trình đọc màn hình thực hiện tác vụ mặc định của cử chỉ hay không.", 
"  Nếu nó trả về true, cử chỉ sẽ bị chặn và nếu sai, nó sẽ quay trở lại lớp trên để thực thi. Nếu cử chỉ trả về false trong một chương trình, nó sẽ được xử lý bởi cử chỉ chung. Nếu cử chỉ toàn cục trả về false, nó sẽ được xử lý bằng cử chỉ mặc định.", 
"        Các lệnh phổ biến,", 
"        service.execute (\"lệnh\", nút)", 
"        Lệnh này là để giải thích một số hướng dẫn tích hợp để đơn giản hóa việc phát triển. Nếu thực thi thành công, nó trả về true và nếu thất bại, nó trả về false.", 
"        service.postExecute (thời gian, \"lệnh\", nút)", 
"        Trì hoãn thực hiện các lệnh,", 
"        text= service.getText (node)", 
"        Nhận thông tin văn bản của nút được chỉ định.", 
"        service.setText (node, text)", 
"        Đặt nội dung văn bản của hộp nhập tiêu điểm được chỉ định.", 
"        service.setText (text)", 
"        Đặt văn bản trong hộp nhập tiêu điểm của giao diện hiện tại.", 
"        Service.copy()", 
"        Sao chép nội dung văn bản của tiêu điểm hiện tại vào khay nhớ tạm.", 
"        Service.appendCopy()", 
"        Nối để sao chép nội dung văn bản hiện tại vào khay nhớ tạm.", 
"        Service.copy (text)", 
"        Sao chép văn bản được chỉ định vào khay nhớ tạm.", 
"        service.appendCopy (text)", 
"        Nối văn bản đã chỉ định vào khay nhớ tạm.", 
"        Service.paste ()", 
"        Dán nội dung của bộ nhớ tạm vào ô nhập liệu của giao diện hiện tại.", 
"        Service.paste (nút)", 
"        Dán nội dung của khay nhớ tạm vào hộp nhập đã chỉ định.", 
"        Service.toNext()", 
"        Trọng tâm tiếp theo.", 
"        service.toNext (nút, bool)", 
"        Chỉ định tiêu điểm tiếp theo của nút. Nếu bool là true, nó sẽ tìm thấy nút con, nếu là false, nó sẽ không tìm thấy nút con.", 
"        Service.toPrevious ()", 
"        Tiêu điểm trước.", 
"        service.toPrevious (nút, bool)", 
"        Chỉ định một điểm tập trung trên nút. Nếu bool là true, nó sẽ tìm thấy các nút con và nếu là false, nó sẽ không tìm thấy các nút con.", 
"        Service.toNextChar()", 
"        Kí tự tiếp theo.", 
"        Service.toPreviousChar()", 
"        Kí tự trước đó.", 
"        Service.toNextLine ()", 
"        Dòng tiếp theo.", 
"        Service.toPreviousLine ()", 
"        Dòng trước đó.", 
"        Servick.toTextStart()", 
"        Về đầu văn bản.", 
"        Service.toTextEnd ()", 
"        Về cuối văn bản.", 
"        Service.toListViewStart()", 
"        Di chuyển về đầu danh sách.", 
"        Service.toListViewEnd ()", 
"        Di chuyển về  cuối danh sách.", 
"        Service.getRootNodeInfo()", 
"        Lấy nút gốc.", 
"        Service.ocr (node)", 
"        Văn bản nhận dạng  nút được chỉ định và chỉ dành cho các thành viên.", 
"        Service.setTimerMode (bool)", 
"        Bật hoặc tắt chế độ hẹn giờ, bool là true để bật, false để tắt.", 
"        service.setAutoReadEnabled (bool)", 
"        Bật hoặc tắt chế độ đọc. Bool là true để bật,  hoặc false để tắt.", 
"        Servick.setAutoNext (bool)", 
"        Bật hoặc tắt chế độ duyệt tự động. Bool là true để bật, fal để tắt", 
"        bool = service.isEditView (node)", 
"        Xác định xem nút hiện tại có phải là hộp chỉnh sửa hay không.", 
"        bool = service.isSeekBar (node)", 
"        Xác định xem nút hiện tại có phải là thanh tiến trình hay không.", 
"        bool = service.isListView (node)", 
"        Xác định xem nút hiện tại có phải là một danh sách hay không.", 
"        bool = service.isInListView (node)", 
"        Xác định xem nút hiện tại có trong danh sách hay không.", 
"        bool = service.isInWebView (node)", 
"        Xác định xem nút hiện tại có trong trang web hay không.", 
"        bool = service.isClick (node)", 
"        Xác định xem nút hiện tại có thể nhấp được không.", 
"        Service.toClick()", 
"        nhấp vào tiêu điểm  hiện tại, ưu tiên dùng lấy nét  analog trên Android 7 trở lên.", 
"        Service.toClick (node)", 
"        Nhấp vào nút được chỉ định.", 
"        Service.toLongClick()", 
"        nhấn và giữ tiêu điểm  hiện tại.", 
"        service.toLongClick (node)", 
"        Nhấn và giữ nút được chỉ định.", 
"        Service.toBack()", 
"        quay lại.", 
"        Service.toHome ()", 
"        Quay lại màn hình chính.", 
"        Service.toNotification()", 
"        Mở thanh thông báo.", 
"        Service.toParent ()", 
"        Mở danh sách ứng dụng  gần đây.", 
"        service.scrollBackward (node)", 
"        Cuộn lên.", 
"        service.scrollForward (nút)", 
"        Cuộn xuống.", 
"        service.loadGesturePackage (tên)", 
"        Tải sơ đồ cử chỉ.", 
"        service.click (x, y)", 
"        Mô phỏng thao tác   nhấp vào toạ độ trên  màn hình để xác định vị trí, chỉ có Android 7 trở lên.", 
"        Service.longClick(x,y)", 
"        Mô phỏng thao tác nhấn và giữ toạ độ vị trí  trên màn hình , chỉ khả dụng trên Android 7 trở lên.", 
"        Service.press (x, y, t)", 
"        Mô phỏng thao tác nhấn và giữ nó trong một thời gian xác định tại một vị trí toạ độ  trên màn hình. Chỉ có Android 7 trở lên.", 
"        Service.swipe (x1, y1, x2, y2, t)", 
"        mô phỏng thao tác vuốt từ toạ độ   vị trí này sang toạ độ  vị trí khác trong thời gian xác định, chỉ có trên Android 7 trở lên.", 
"        Báo cáo kiểm soát mã.", 
"        nếu có điều kiện thì", 
"        Mã để thực thi", 
"        end", 
"        Đáp ứng các điều kiện quy định để thực thi mã trung gian.", 
"        Chẳng hạn như,", 
"if service.isEditView(node) then service.execute(edik text,node)", 
" return true", 
" end", 
"        Mã này có nghĩa là khi tiêu điểm là hộp chỉnh sửa, chỉnh sửa tách được bật.", 
"        với n = 1, số lần lặp lại", 
"        Để thực thi mã", 
"        end", 
"        Lặp lại mã được chỉ định một số lần nhất định", 
"        Chẳng hạn như,", 
"for n=1,10 do", 
" service.toBack()", 
" end", 
"        Lặp lại 10 lần.", 
"        Xác định một chức năng,", 
"        chức năng tên chức năng (tham số)", 
"        Mã chức năng", 
"        end", 
"        Hàm là các khối mã chức năng có thể được sử dụng lại một cách hiệu quả.", 
"        Ví dụ, sau đây là hàm thêm dữ liệu vào danh sách. Trong mã cử chỉ, nó có thể được sử dụng để thêm mã trùng lặp vào danh sách.", 
"function append(t1,t2)", 
" for k,v in ipairs(t2) do", 
" table.insert(t1,v)", 
" end ", 
" end ", 
" danh sách truy cập={}", 
" danh sách các nút={%nhấn,%quay lại}", 
" for n=1,10 do", 
" append(nối danh sách nhấp chuột, danh sách các nút)", 
" end", 
"Liên tục thêm nội dung của danh sách nút 10 lần vào danh sách nhấp chuột", 
"        chức năng trượt ()", 
"        service.swipe (500,300,500,1000,1000)", 
"        return true", 
"        end", 
"        Mô phỏng một bàn tay vuốt trên màn hình và sử dụng nó trong mã cử chỉ,", 
"        service.click ({{'>Wechat', '%滑'}})", 
"        Mở mô phỏng WeChat và vuốt xuống từ màn hình.", 
"        nhấp tự động,", 
"        service.click ((danh sách nút))", 
"        Tự động tìm kiếm từng nút trong danh sách nút bấm,", 
"        Tên nút hỗ trợ một số ký hiệu cho ký tự đại diện,", 
"        Nếu bạn thêm dấu # (#) ở phía trước, nghĩa là bạn đang tìm kiếm các thẻ tùy chỉnh.", 
"        Thêm * (dấu hoa thị) trước hoặc sau để cho biết rằng có các ký tự khác trước hoặc sau,", 
"        Thêm # (#) sau thứ tự nút,", 
"        Thêm @ (khoanh tròn a) vào sau nó để chỉ tìm thấy trong một chương trình nhất định,", 
"        Thêm $ (đô la) có nghĩa là trì hoãn sau khi thực hiện xong.", 
"        Tham số hỗ trợ nhiều bảng, tra cứu theo thứ tự,", 
"        Nếu tra cứu thành công, nó trả về true, ngược lại, nó trả về false.", 
"        Xem mô tả đầy đủ bên dưới,", 
"        Nhấp chuột bị trì hoãn,", 
"        service.postClick(time, (buten lish))", 
"        Nhấp chuột được thực hiện sau một thời gian trễ nhất định. Đơn vị thời gian là mili giây. Định nghĩa danh sách nút giống như nhấp chuột.", 
"        Không có giá trị trả lại.", 
"        service.plugin ('tên plugin', nút)", 
"        Thực hiện một plugin,", 
"        Trả về giá trị do tùy chỉnh plugin trả về.", 
"        Cử chỉ bình luận linh hoạt nhất với các nhấp chuột tự động, hình thức cơ bản là", 
"        Danh sách nút = ()", 
"        service.click (danh sách nút)", 
"        return true", 
"        Hai dòng dưới cùng được cố định. Bạn chỉ cần sửa đổi danh sách nút.", 
"        Định dạng danh sách nút bao gồm một số tên nút và ký hiệu được đặt trong dấu ngoặc nhọn hoặc dấu ngoặc nhọn tiếng Anh.", 
"        Ví dụ đơn giản nhất,", 
"        Danh sách nút = {'OK'}", 
"        service.click (danh sách nút)", 
"        return true", 
"        Mã này sẽ nhấp vào nút OK trên màn hình,", 
"        Danh sách nút = {", 
"        'ok',", 
"        'kết thúc'", 
"        }", 
"        service.click (danh sách nút)", 
"        return true", 
"        Đây là cấp độ đầu tiên của dấu ngoặc nhọn, nếu bạn chắc chắn, hãy nhấp vào OK, nếu bạn không chắc chắn, hãy nhấp vào Kết thúc, nếu bạn không chắc chắn, hãy tiếp tục tìm kiếm để hoàn thành, v.v.", 
"        Đôi khi chúng ta cần nhấp liên tục vào một loạt các nút để đạt được một số chức năng. Đây cũng là ưu điểm của nhấp chuột tự động.", 
"        Danh sách nút = {", 
"        {'Thẻ dữ liệu nhóm', 'Tệp'}", 
"        }", 
"        service.click (danh sách nút)", 
"        trả về đúng", 
"        Đây là một dấu ngoặc nhọn cấp hai. Các nút trong dấu ngoặc nhọn cấp hai sẽ được nhấp lần lượt cho đến khi một trong các nút không tồn tại.", 
"        Dấu ngoặc lồng trong dấu ngoặc nhọn cho phép nhấp chuột liên tục,", 
"        Trong danh sách nút, chúng tôi sử dụng một số ký hiệu để nâng cao chức năng,", 
"        Thường được sử dụng nhất là * dấu hoa thị, dấu hoa thị tiếng Anh, ký hiệu này ở trước và sau văn bản nút, cho biết có thể có nội dung khác", 
"        Ví dụ: bạn cần nhấp vào giao diện chính của QQ để giải thích nhóm giao tiếp đọc màn hình và đôi khi sẽ có 99 nội dung chưa đọc ở cuối danh sách này.", 
"        Nhóm đọc màn hình diễn giải *", 
"        # Dấu hiệu tốt, có nghĩa là số lượng kết quả. Đôi khi một giao diện có nhiều nút trùng tên. Tại thời điểm này, bạn cần sử dụng dấu hiệu tốt để giải thích số lần nhấp.", 
"        Ví dụ: xác định #1, có nghĩa là số đầu tiên, hoặc số âm. Ví dụ: xác định # -1, có nghĩa là cái cuối cùng.", 
"        Dấu thăng ở đầu văn bản cho biết rằng nút được tìm kiếm là nhãn của nút chứ không phải tên của nút.", 
"        Biểu tượng đường thẳng đứng tiếng Trung và tiếng Anh | có nghĩa là, hoặc, nghĩa là, nếu có một đường thẳng đứng trước khi nhấp vào mặt trước, nếu không có nhấp chuột nào ở mặt sau,", 
"        Lấy ví dụ vừa được xác định và hoàn thành, có thể được viết tắt là,", 
"        ok|kết thúc", 
"        Nhấp vào OK hoặc Kết thúc,", 
"        & có nghĩa là và, nghĩa là chỉ giao diện có nội dung phía sau & biểu tượng, nhấp vào nút ở phía trước,", 
"        ok&*thoát *", 
"        Có nghĩa là chỉ khi có một từ thoát trên giao diện này, chẳng hạn như Bạn có chắc chắn thoát, bấm OK và không thực hiện mà không có hai từ,", 
"        & theo sau là dấu chấm than và từ khóa cho biết nội dung không được bao gồm,", 
"        ok& amp;!* thoát*", 
"        Nghĩa là chỉ nhấn OK khi không có chữ thoát trên giao diện này, còn nếu có 2 chữ thoát thì sẽ không thực hiện được.", 
"        &đăng nhập trước kiểm tra loại tiêu điểm hiện tại,", 
"        &có thể chỉnh sửa", 
"        &Có thể nhấp", 
"        &danh sách", 
"        & danh sách các mục", 
"        &hộp chỉnh sửa", 
"        Hộp chỉnh sửa này là hộp chỉnh sửa bật lên phương thức nhập liệu,", 
"        $ Ký hiệu đô la Mỹ, ký hiệu phía sau văn bản này cho biết phải đợi bao lâu sau khi nhấp vào nút, để thực hiện thao tác tiếp theo,", 
"        'Thẻ thông tin nhóm$2000', 'Tệp'", 
"        Có nghĩa là nhấp vào tệp 2 giây sau khi nhấp vào thẻ hồ sơ nhóm,", 
"        < nhỏ hơn dấu, có nghĩa là thực hiện lặp đi lặp lại, số lần nhấp vào nút liên tục,", 
"        Chẳng hạn như", 
"        Bài hát tiếp theo<10", 
"        Chỉ cần nhấp vào bài hát tiếp theo mười lần,", 
"        Dấu nhỏ hơn ở phía trước có nghĩa là chỉ định vị, không nhấp chuột.", 
"        <ok", 
"        Tìm OK nhưng không nhấp vào.", 
"        > Dấu hiệu lớn hơn, dấu hiệu lớn hơn được chỉ định ở phía sau, dấu hiệu thời gian chờ đợi,", 
"        'Thẻ hồ sơ nhóm', 'tệp>10'", 
"        Điện thoại di động phản hồi nhanh hay chậm. Sử dụng biểu tượng này để đợi trong một thời gian nhất định. Mã này chỉ ra rằng sau khi nhấp vào thẻ dữ liệu nhóm, hãy đợi trong mười giây. Nếu tệp xuất hiện trong vòng mười giây, hãy nhấp ngay lập tức và dừng thực thi nếu hết thời gian chờ.", 
"        Dấu lớn hơn ở đầu có thể mở chương trình,", 
"        >Wechat", 
"        Mở WeChat,", 
"        >QQ", 
"        Mở QQ,", 
"        Ngoài ra còn có các biểu tượng mở rộng có thể thực hiện các chức năng khác,", 
"        % Có thể thực hiện một số lệnh phổ biến,", 
"        chẳng hạn như,", 
"        %sao chép", 
"        Có thể được sao chép,", 
"        % Toàn văn được đọc to", 
"        Có thể đọc toàn màn hình,", 
"        % Cũng có thể thực thi chức năng được chỉ định trong tập lệnh, hàm trả về true để tiếp tục thực hiện, false để dừng thực thi,", 
"        [] Nội dung trong ngoặc vuông cho biết nhấp chuột trực tiếp được mô phỏng và khác với việc sử dụng các chức năng phụ trợ. Nhấp chuột trực tiếp có thể giải quyết một số vấn đề không thể nhấp chuột.", 
"        [fát]", 
"        Mô phỏng nhấp trực tiếp vào nút phát,", 
"[ % Nhấp chuột]", 
"        Nhấp trực tiếp vào tiêu điểm hiện tại", 
"        ", 
"        [x, y] Dấu ngoặc vuông chứa hai số để chỉ vị trí xác định của nhấp chuột tương tự. Bạn có thể sử dụng số nguyên để chỉ vị trí tuyệt đối hoặc số thập phân để chỉ vị trí tương đối.", 
"        [300,500]", 
"        Nhấp chuột mô phỏng đếm 300 pixel từ bên trái và 500 pixel từ trên xuống.", 
"        [0.3,0.5]", 
"        Mô phỏng nhấp chuột bằng 0,3 chiều rộng màn hình từ bên trái và 0,5 chiều cao màn hình từ trên xuống,", 
"        ", 
"        [x, y, t] Dấu ngoặc vuông chứa ba số để chỉ thời gian xác định được nhấp chuột tại vị trí xác định. Hai cái đầu tiên có cùng ý nghĩa với cái trước. Thứ ba là thời gian tính bằng mili giây.", 
"        [300,500,1000]", 
"        Mô phỏng nhấp chuột 300 pixel từ bên trái và 500 pixel từ trên cùng trong 1000 mili giây", 
"        ", 
"        [x1, y1, x2, y2, t] Các dấu ngoặc vuông chứa năm số để mô phỏng trượt từ vị trí x1, y1 đến x2, y2 tại một thời điểm xác định. Vị trí tuyệt đối có thể được biểu thị dưới dạng số nguyên hoặc vị trí tương đối dưới dạng số thập phân.", 
"        [300.500.300.800.1000]", 
"        Mô phỏng 300 pixel từ bên trái, 500 pixel từ trên cùng và trượt đến vị trí 300.800 trong 1000 mili giây.", 
"        ", 
"        Mô phỏng vuốt cũng có thể chỉ định số lần vuốt", 
"        [300,500,300,800,1000,10]", 
"        Mô phỏng đếm 300 pixel từ bên trái, 500 pixel từ trên xuống, trượt đến vị trí 300.800 với 1000 mili giây, 10 lần,", 
"        ", 
"        Đôi khi trong quá trình thực hiện các cử chỉ, có một số tình huống khác nhau, chẳng hạn như mở QQ, nhấp vào nhóm giao tiếp màn hình đọc bình luận, nhấp vào thẻ thông tin nhóm, nhấp vào tệp,", 
"        Nếu có thông báo nhóm sẽ bị kẹt ở bước bấm thẻ thông tin nhóm và không thực hiện được.", 
"        Mã chi nhánh là cần thiết để thực hiện các trường hợp khẩn cấp này,", 
"        Tôi chỉ viết tay một ví dụ. Có thể có lỗi đánh máy không thể thực hiện được. Chỉ cần hiểu ý nghĩa.", 
"        ", 
"        Danh sách nút = {", 
"        {", 
"            '>QQ',", 
"        'Nhận xét về Nhóm Giao tiếp Màn hình Đọc *',", 
"        {", 
"              'Tôi đã đọc thông báo của nhóm | Tôi biết'", 
"        },", 
"        'Thẻ hồ sơ nhóm',", 
"        'tài liệu'", 
"        }", 
"        }", 
"        ", 
"        Vì phiên bản QQ khác nên nút thông báo nhóm cũng khác.", 
"        Có thể thấy rằng sau khi nhấp vào nhóm giao tiếp màn hình đọc bình luận, có một cặp nút bổ sung được đặt trong dấu ngoặc nhọn. Các nút trong khung này được thực hiện nếu không có và bỏ qua nếu không, điều này không ảnh hưởng đến việc thực hiện các nút tiếp theo.", 
"        Nếu có các hoạt động phức tạp trong nhánh hoặc nhiều kịch bản, chúng ta cũng có thể đặt nhiều dấu ngoặc,", 
"        ", 
"        Danh sách nút = {", 
"        {", 
"            '>QQ',", 
"        'Nhận xét về Nhóm Giao tiếp Màn hình Đọc *',", 
"        {", 
"              { 'Tôi đã đọc thông báo nhóm', 'OK' },", 
"        { 'Tôi hiểu', 'OK' },", 
"        },", 
"        'Thẻ hồ sơ nhóm',", 
"        'tài liệu'", 
"        }", 
"        }",}

local layout = {
    LinearLayout,  -- Use a LinearLayout to arrange elements vertically
    orientation = "vertical",
    {
        EditText,  -- Search input at the top
        id = "searchInput",
        hint = "Nhập từ khóa tìm kiếm",
        layout_width = "match_parent",
    },
    {
        Button,  -- Search button
        id = "searchButton",
        text = "Tìm kiếm",
        layout_width = "wrap_content",
        layout_height = "wrap_content",
    },
    {
        ListView,
        id = "listView",
    },
}

local dlg = LuaDialog(service)
    .setTitle("hướng dẫn và giới thiệu các API độc quyền của jsr")

dlg.View = loadlayout(layout)
listView.adapter = ArrayAdapter(service, android.R.layout.simple_list_item_1, sj)

-- Handle search button click to show keyboard and perform search
searchButton.onClick = function()
    local query = tostring(searchInput.getText())  -- Get text from EditText
    if query ~= "" then
        buscar2(query)  -- Call the search function
    else
        service.asyncSpeak("Vui lòng nhập từ khóa tìm kiếm.")  -- Notify user to enter a search term
    end
    searchInput.requestFocus()  -- Request focus for the search input
    service.inputMethodManager.showSoftInput(searchInput, 0)  -- Show the keyboard
end

dlg.setButton("Đóng", nil)  -- Close button

function normalize_vietnamese(text)
    return text  -- Simplified for now
end

function buscar2(query)
    query = normalize_vietnamese(query)
    local currentPageItems = sj

    local filteredItems = {}
    if query ~= "" then
        local queryLower = query:lower()
        for index, item in ipairs(currentPageItems) do
            local itemLower = normalize_vietnamese(item):lower()
            if itemLower:find(queryLower) then
                table.insert(filteredItems, item)
            end
        end
    else
        filteredItems = currentPageItems
    end

    if #filteredItems == 0 then
        service.asyncSpeak("Không tìm thấy kết quả.")
    else
        service.asyncSpeak("Đã tìm thấy " .. tostring(#filteredItems) .. " kết quả.")
    end

    local filteredAdapter = ArrayAdapter(service, android.R.layout.simple_list_item_1, filteredItems)
    listView.setAdapter(filteredAdapter)
end

-- Handle pressing Enter on the keyboard
searchInput.setOnEditorActionListener {
    onEditorAction = function(v, actionId, event)
        if actionId == android.view.inputmethod.EditorInfo.IME_ACTION_SEARCH then  -- Check for search action
            local query = tostring(searchInput.getText())
            buscar2(query)
            searchInput.setText("")  -- Clear the search input after searching
            return true
        end
    end
}

listView.onItemClick = function(l, v, p, i)
    dlg.hide()
    task(100, function()
        service.postSpeak(200, sj[p + 1])
    end)
end

dlg.show()
return true